package netty.demo_01_simple;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

/**
 * Netty快速入门实例-TCP服务
 * 客户端
 *
 * @author chenyuan
 * @date 2020/11/6 18:19
 */
public class NettyClient {
	public static void main(String[] args) throws InterruptedException {
		// 客户端需要一个事件循环组
		EventLoopGroup group = new NioEventLoopGroup();

		try {

			// 客户端启动对象 —— Bootstrap ，不是 服务端的 ServerBootstrap
			// 并且是 io.netty.bootstrap 包下的
			Bootstrap bootstrap = new Bootstrap();

			// 设置相关参数
			bootstrap.group(group)// 设置线程组
					.channel(NioSocketChannel.class)// 设置客户端通道的实现类
					.handler(new ChannelInitializer<SocketChannel>() {// 设置处理器
						@Override
						protected void initChannel(SocketChannel socketChannel) throws Exception {
							socketChannel.pipeline().addLast(new NettyClientHandler());// 加入自己的处理器
						}
					});
			System.out.println("客户端准备好了……");

			// 启动客户端连接服务器端
			// 这里涉及到一个 Netty 的异步模型,后面详述
			ChannelFuture channelFuture = bootstrap.connect("localhost", 6668).sync();
			// 对关闭通道进行监听
			channelFuture.channel().closeFuture().sync();
		} finally {
			group.shutdownGracefully();
		}

	}
}
